package main

import (
	"fmt"
	"github.com/kataras/iris"
	"github.com/sirupsen/logrus"
	"net/http"
	"strconv"
)

func main() {
	app := iris.Default()                      // 获取Iris Web框架实例
	app.Get("/hello", func(ctx iris.Context) { // 上下文管理了所有的请求和响应的工具方法
		ctx.WriteString("hello,world! iris")
	}) // 访问：http://localhost:8082/hello ==> hello,world! iris

	// 1.Iris支持参数化的path：字符串、整形数字、bool、大小写字母、file、path类型的匹配
	app.Get("/users/{id:uint64}", func(ctx iris.Context) {
		id := ctx.Params().GetUint64Default("id", 0) // 参数：id必须与参数变量名：id保持一致
		ctx.WriteString(strconv.Itoa(int(id)))       // 将结果输出到浏览器
	}) // 访问：http://localhost:8082/users/123 ==> 123

	app.Get("/users/{action:path}", func(ctx iris.Context) {
		action := ctx.Params().Get("action")
		ctx.WriteString(action)
	}) // 访问：http://localhost:8082/users/12w/3242/您好  ==> 12w/3242/您好

	// 2.Iris支持六种匹配规则函数：正则表达式、前缀、后缀、包含最大、最小、整数范围；支持自定义匹配规则函数
	app.Get("/users/{id:uint64 min(2)}", func(ctx iris.Context) {
		id := ctx.Params().GetUint64Default("id", 0)
		ctx.WriteString(strconv.Itoa(int(id)))
	}) // 访问：http://localhost:8082/users/1 ==> 访问的路径不存在。 http://localhost:8082/users/2 ==> 2

	app.Get("/orders/{action:string prefix(a_)}", func(ctx iris.Context) {
		a := ctx.Params().Get("action")
		ctx.WriteString(a)
	}) // 访问：http://localhost:8082/orders/abc ==> 访问的路径不存在。http://localhost:8082/orders/a_bc ==> a_bc

	// 3.支持路由分组，通过Party来管理同一类API
	v1 := app.Party("/v1")
	v1.Get("/users/{id:uint64 min(2)}", func(ctx iris.Context) {
		id := ctx.Params().GetUint64Default("id", 0)
		ctx.WriteString(strconv.Itoa(int(id)))
	}) // 访问：http://localhost:8082/v1/users/29 ==> 29

	v1.Get("/orders/{action:string prefix(a_)}", func(ctx iris.Context) {
		a := ctx.Params().Get("action")
		ctx.WriteString(a)
	}) // 访问：http://localhost:8082/v1/orders/a_bc ==> a_bc

	// 4.使用中间件，路由分组中也支持单独使用中间件
	v2 := app.Party("/v2")
	v2.Use(func(context iris.Context) {
		logrus.Info("自定义中间件")
		context.Next()
	})

	v2.Get("/users/{id:uint64 min(2)}", func(ctx iris.Context) {
		id := ctx.Params().GetUint64Default("id", 0)
		ctx.WriteString(strconv.Itoa(int(id)))
	}) // 访问：http://localhost:8082/v2/users/29 ==> 29

	v2.Get("/orders/{action:string prefix(a_)}", func(ctx iris.Context) {
		a := ctx.Params().Get("action")
		ctx.WriteString(a)
	}) // 访问：http://localhost:8082/v2/orders/a_bc ==> a_bc

	// 5.错误信息自定义
	app.OnAnyErrorCode(func(context iris.Context) {
		context.WriteString("看起来服务器出错了！") // 如果请求处理出现错误，则会执行此行代码
	})

	app.OnErrorCode(http.StatusNotFound, func(context iris.Context) {
		context.WriteString("访问的路径不存在！") // 如果找不到请求访问路径，则会执行此行代码
	})

	app.Get("/helloworld", func(ctx iris.Context) { // 上下文管理了所有的请求和响应的工具方法
		panic("出错了") // 演示使用错误信息自定义：
		ctx.WriteString("hello,world! iris")
	}) // 访问：http://localhost:8082/helloworld ==> 访问的路径不存在！

	err := app.Run(iris.Addr(":8082")) // 监听端口
	fmt.Println(err)
}
